#ifndef HORIZONTALDOUBLELINEDRAWER_H
#define HORIZONTALDOUBLELINEDRAWER_H

#include <QObject>
#include <QGraphicsScene>
#include <QGraphicsLineItem>
#include <QPointF>
#include <QList>
#include "../Common/DraggableLineItem.h"

// 提前声明，避免循环依赖
enum class MeasurementMode : int;

/**
 * @brief 横向双线测量绘制器类
 * 
 * 用于在图像上绘制横向双线测量工具，支持开始绘制、更新绘制、完成绘制等功能。
 * 继承自QObject，提供信号槽机制支持。
 */
class HorizontalDoubleLineDrawer : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父对象
     */
    explicit HorizontalDoubleLineDrawer(QObject *parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~HorizontalDoubleLineDrawer();

    /**
     * @brief 获取测量模式
     * @return 测量模式枚举值
     */
    MeasurementMode getMeasurementMode() const;

    /**
     * @brief 设置图形场景
     * @param scene 图形场景指针
     */
    void setScene(QGraphicsScene *scene);

    /**
     * @brief 初始化并显示水平线
     * @param imageWidth 图像宽度
     * @param imageHeight 图像高度
     * @param scale 缩放比例
     * @param offset 图像偏移
     */
    void initializeLine(int imageWidth, int imageHeight, double scale = 1.0, const QPointF &offset = QPointF(0, 0));

    /**
     * @brief 清除所有绘制项
     */
    void clearAll();

    /**
     * @brief 从测量结果恢复绘制
     * @param result 测量结果
     * @param scale 缩放比例
     * @param offset 偏移量
     */
    void restoreFromResult(const QVariantMap &result, double scale, const QPointF &offset);
    
    /**
     * @brief 设置绘制样式参数
     * @param params 样式参数映射
     */
    void setParameters(const QVariantMap &params);
    
    /**
     * @brief 设置缩放比例
     * @param scale 新的缩放比例
     */
    void setScale(double scale);

private:
    /**
     * @brief 创建线项
     * @param start 起始点
     * @param end 结束点
     * @return 创建的线项指针
     */
    DraggableLineItem *createLineItem(const QPointF &start, const QPointF &end);

    /**
     * @brief 初始化绘制样式
     */
    void initializeStyles();

    /**
     * @brief 添加绘制项到场景
     * @param item 要添加的图形项
     */
    void addDrawingItem(QGraphicsItem *item);

    /**
     * @brief 移除所有绘制项
     */
    void removeAllItems();
    
    /**
     * @brief 处理线位置变化
     */
    void onLinePositionChanged();
    
    /**
     * @brief 场景坐标转换为图像坐标
     * @param scenePos 场景坐标
     * @return 图像坐标
     */
    QPointF sceneToImageCoordinates(const QPointF &scenePos) const;
    
    /**
     * @brief 图像坐标转换为场景坐标
     * @param imagePos 图像坐标
     * @return 场景坐标
     */
    QPointF imageToSceneCoordinates(const QPointF &imagePos) const;
    
signals:
    /**
     * @brief 线位置变化信号
     * @param result 包含测量结果的映射，包括距离和线位置信息
     */
    void lineChanged(const QVariantMap &result);

private:
    QGraphicsScene *m_scene; ///< 图形场景指针
    DraggableLineItem *m_topLine; ///< 顶部线
    DraggableLineItem *m_bottomLine; ///< 底部线
    QList<QGraphicsItem *> m_drawingItems; ///< 绘制项列表
    
    // 图像参数
    int m_imageWidth; ///< 图像宽度
    int m_imageHeight; ///< 图像高度
    double m_scale; ///< 缩放比例
    QPointF m_offset; ///< 偏移量

    // 样式参数
    QPen m_linePen; ///< 线画笔
    int m_lineWidth; ///< 线宽
    QColor m_lineColor; ///< 线颜色
};

#endif // HORIZONTALDOUBLELINEDRAWER_H
